package de.revdev.streckenliste.managedbeans;

import de.revdev.streckenliste.beans.AbschussPlManager;
import de.revdev.streckenliste.beans.SlBuilder;
import de.revdev.streckenliste.beans.exception.SLNichtAbgschlossenException;
import de.revdev.streckenliste.dao.RevierDAO;
import de.revdev.streckenliste.dao.WildtypDAO;
import de.revdev.streckenliste.entities.AbschPlEintrag;
import de.revdev.streckenliste.entities.Abschussplan;
import de.revdev.streckenliste.entities.Revier;
import de.revdev.streckenliste.entities.Streckenliste;
import de.revdev.streckenliste.entities.Wildart;
import de.revdev.streckenliste.entities.Wildtyp;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.TabChangeEvent;

/**
 *
 * @author f.lindermaier
 */
@Named(value = "revierBean")
@SessionScoped
public class RevierBean implements Serializable {

    @Inject
    private NavigationBean nbean;
    @Inject
    private SlBuilder slbuilder;
    @Inject
    private RevierDAO rdao;
    @Inject
    private WildtypDAO wtdao;
    @Inject
    private AbschussPlManager abSchuPlMa;
    private Abschussplan abschussplan;
    private Wildtyp wt;
    private Revier selectedRevier;
    private Streckenliste streckenliste;
    private String jahr;
    private String jahrSl;
    private int anzahl;
    private List<AbschPlEintrag> lstAbschPlEin;
    private int index;
    private UIComponent message;
    private UIComponent neusljahr;

    /**
     * Creates a new instance of RevierBean
     */
    public RevierBean() {
    }

    @PostConstruct
    public void init() {
        abschussplan = new Abschussplan();
        index = 0;
    }

    public boolean pruefeNichtAbgeschlosseneSLVorhanden() {
        selectedRevier = nbean.getSelectedRevier();
        selectedRevier = rdao.edit(selectedRevier);
        if (selectedRevier.getStreckenListen() == null || selectedRevier.getStreckenListen().isEmpty()) {
            return false;
        } else if (pruefeSL(selectedRevier.getStreckenListen())) {
            return false;
        } else {
            return true;
        }
    }

    private boolean pruefeSL(List<Streckenliste> lstSL) {
        for (Streckenliste sl : lstSL) {
            if (!sl.isIstAbgeschlossen()) {
                return false;
            }
        }
        return true;
    }

    public String setzeSL() {

        for (Streckenliste sl : selectedRevier.getStreckenListen()) {
            if (sl.getJagdJahr().equals(jahrSl)) {
                FacesContext fc = FacesContext.getCurrentInstance();
                fc.addMessage(neusljahr.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Diese Streckenliste ist schon vorhanden", "Diese Streckenliste ist schon vorhanden"));
                return "";
            }
        }
        try {
            slbuilder.erstelleSL(selectedRevier, jahrSl);
            nbean.refreshModel();
        } catch (SLNichtAbgschlossenException ex) {
            Logger.getLogger(RevierBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "/faces/user/revierbearb.xhtml?redirect=true";
    }

    public List<Wildtyp> holeWildtyp() {
        return wtdao.findWtAbschpfl();
    }

    public void setzeWaVonWt() {
        lstAbschPlEin = new LinkedList<>();
        if (wt != null) {
            for (Wildart wa : wt.getWildart()) {
                AbschPlEintrag abl = new AbschPlEintrag();
                abl.setWildart(wa);
                lstAbschPlEin.add(abl);
            }
        }
    }

    public List<Abschussplan> holeAbschuss() {
        selectedRevier = nbean.getSelectedRevier();
        return selectedRevier.getAbschussplaene();
    }

    public String speichereAbschuss() {
        for (Abschussplan aPlan : holeAbschuss()) {
            if ((Integer.parseInt(aPlan.getJahr()) <= Integer.parseInt(abschussplan.getJahr()) && Integer.parseInt(abschussplan.getJahr()) <= Integer.parseInt(aPlan.getJahr()) + wt.getDauerAbschPL() - 1) && aPlan.getWildtyp().getId().equals(wt.getId())) {
                FacesContext.getCurrentInstance().addMessage(message.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Abschussplan bereits vorhanden", "Abschussplan bereits vorhanden"));
                index = 1;
                return "";
            }
        }
        abschussplan.setRevier(selectedRevier);
        abschussplan.setWildtyp(wt);
        abSchuPlMa.erstelleAbschPl(abschussplan);
        for (AbschPlEintrag ae : lstAbschPlEin) {
            ae.setAbschussplan(abschussplan);
            ae = abSchuPlMa.erstelleAbschPlEintrag(ae);
        }
        abschussplan.setEintrag(lstAbschPlEin);
        nbean.refreshModel();
        selectedRevier = nbean.getSelectedRevier();
        index = 0;
        abschussplan = new Abschussplan();
        return "/faces/user/revierbearb.xhtml?faces-redirect=true";
    }

    public void zeigeAbschussVorhanden(Abschussplan abSchPl) {
        wt = abSchPl.getWildtyp();
        lstAbschPlEin = abSchPl.getEintrag();
        this.abschussplan = abSchPl;
        index = 1;
    }

    public void onTabChange(TabChangeEvent event) {
        if (event.getTab().getClientId().equals("tabView:abschplNeu")) {
            wt = null;
            lstAbschPlEin = null;
            abschussplan = new Abschussplan();
        }
    }

    public String bearbeiteAbschuss() {
        for (AbschPlEintrag ae : lstAbschPlEin) {
            ae.setAbschussplan(abschussplan);
            ae = abSchuPlMa.bearbeiteAbschPlEintrag(ae);
        }
        nbean.refreshModel();
        selectedRevier = nbean.getSelectedRevier();
        index = 0;
        return "/faces/user/revierbearb.xhtml?faces-redirect=true";
    }

    public String löscheAbschuss(Abschussplan abschPl) {
        abSchuPlMa.löscheAbschussplan(abschPl);
        nbean.getSelectedRevier().getAbschussplaene().remove(abschPl);
        nbean.refreshModel();
        return "/faces/user/revierbearb.xhtml?faces-redirect=true";
    }

    public String clear() {
        wt = null;
        lstAbschPlEin = null;
        abschussplan = new Abschussplan();
        index = 0;
        return "/faces/user/revierbearb.xhtml?faces-redirect=true";
    }

    public Wildtyp getWt() {
        return wt;
    }

    public void setWt(Wildtyp wt) {
        this.wt = wt;
    }

    public Streckenliste getStreckenliste() {
        return streckenliste;
    }

    public void setStreckenliste(Streckenliste streckenliste) {
        this.streckenliste = streckenliste;
    }

    public String getJahr() {
        return jahr;
    }

    public void setJahr(String jahr) {
        this.jahr = jahr;
    }

    public Revier getSelectedRevier() {
        return selectedRevier;
    }

    public void setSelectedRevier(Revier selectedRevier) {
        this.selectedRevier = selectedRevier;
    }

    public NavigationBean getNbean() {
        return nbean;
    }

    public void setNbean(NavigationBean nbean) {
        this.nbean = nbean;
    }

    public int getAnzahl() {
        return anzahl;
    }

    public void setAnzahl(int anzahl) {
        this.anzahl = anzahl;
    }

    public List<AbschPlEintrag> getLstAbschPlEin() {
        return lstAbschPlEin;
    }

    public void setLstAbschPlEin(List<AbschPlEintrag> lstAbschPlEin) {
        this.lstAbschPlEin = lstAbschPlEin;
    }

    public Abschussplan getAbschussplan() {
        return abschussplan;
    }

    public void setAbschussplan(Abschussplan abschussplan) {
        this.abschussplan = abschussplan;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public UIComponent getMessage() {
        return message;
    }

    public void setMessage(UIComponent message) {
        this.message = message;
    }

    public String getJahrSl() {
        return jahrSl;
    }

    public void setJahrSl(String jahrSl) {
        this.jahrSl = jahrSl;
    }

    public UIComponent getNeusljahr() {
        return neusljahr;
    }

    public void setNeusljahr(UIComponent neusljahr) {
        this.neusljahr = neusljahr;
    }
}